from django.shortcuts import render
from django.views import View
from django.http import JsonResponse
from apps.goods.models import GoodsChannel,GoodsCategory
# 有序字典
from collections import OrderedDict
from apps.users.models import User
from apps.contents.models import ContentCategory, Content

# Create your views here.

class IndexView(View):

    def get(self, request):
        # 构造有序字典 这是空字典data_dict = {}
        data_dict = OrderedDict()

        # 获取所有商品分组信息，按照分组id和组内顺序排序
        channels = GoodsChannel.objects.all().order_by('group_id', 'sequence')
        for channel in channels:
            # 提取分组id信息
            group_id = channel.group_id
            # 判端group_id是否已经在字典中存在
            if group_id not in data_dict:
                data_dict[group_id] = {'channels': [], 'sub_cats': []}
            # 使用商品频道对象关联查询分类表的数据
            cat1 = channel.category
            data_dict[group_id]['channels'].append({
                'id': cat1.id,  # 一级分类id
                'name': cat1.name,  # 一级分类名称
                'url': channel.url})
            # 根据一级分类获取二级分类信息
            cat2s = GoodsCategory.objects.filter(parent_id=cat1.id)
            for cat2 in cat2s:
                # 额外cat2对象赋值一个空列表
                cat2.sub_cats = []
                # 根据二级分类查询三级分类
                cat3s = GoodsCategory.objects.filter(parent_id=cat2.id)
                for cat3 in cat3s:
                    # 将所有的三级分类添加到二级分类中
                    cat2.sub_cats.append({'id': cat3.id,'name': cat3.name})

                # 添加二级分类
                data_dict[group_id]['sub_cats'].append({
                    'id': cat2.id,
                    'name': cat2.name,
                    'sub_cats': cat2.sub_cats  # 给三级分类赋值
                })

        return JsonResponse(data_dict)

class TemplateVIew(View):
    """
    模版的回顾使用
    """
    def get(self, request):
        # 查询数据
        users = User.objects.all()
        # 广告数据
        content = Content.objects.get(id=1)

        # 数据渲染
        context = {'users': users, 'content': content}
        # 获取渲染后的数据
        data = render(request, 'index_test.html', context=context)
        html_str = data.content.decode()
        print(html_str)
        # 为了前端服务能够加载前端页面，需要将数据写入一个html文件存入到前端文件目录下
        # 打开前端目录下的一个template.html文件
        with open('/home/ubuntu/Desktop/front_end_pc/template.html', 'w', encoding='utf-8') as f:f.write(html_str)
        return JsonResponse({'code': 'ok'})







class IndexTemplateVIew(View):
    """
    首页模板渲染
    """

    def get(self, request):
        # 构造有序字典 这是空字典data_dict = {}
        # data_dict = OrderedDict()
        data_dict = {}
        # 获取所有商品分组信息，按照分组id和组内顺序排序
        channels = GoodsChannel.objects.all().order_by('group_id', 'sequence')
        for channel in channels:
            # 提取分组id信息
            group_id = channel.group_id
            # 判端group_id是否已经在字典中存在
            if group_id not in data_dict:
                # 使用group_id作为data_dict的key，进行赋值
                data_dict[group_id] = {'channels': [], 'sub_cats': []}
            # 使用商品频道对象关联查询分类表的数据
            cat1 = channel.category
            data_dict[group_id]['channels'].append({
                'id': cat1.id,  # 一级分类id
                'name': cat1.name,  # 一级分类名称
                'url': channel.url})
            # 根据一级分类获取二级分类信息
            cat2s = GoodsCategory.objects.filter(parent_id=cat1.id)
            for cat2 in cat2s:
                # 额外cat2对象赋值一个空列表
                cat2.sub_cats = []
                # 根据二级分类查询三级分类
                cat3s = GoodsCategory.objects.filter(parent_id=cat2.id)
                for cat3 in cat3s:
                    # 将所有的三级分类添加到二级分类中
                    cat2.sub_cats.append({'id': cat3.id, 'name': cat3.name})

                # 添加二级分类
                data_dict[group_id]['sub_cats'].append({
                    'id': cat2.id,
                    'name': cat2.name,
                    'sub_cats': cat2.sub_cats  # 给三级分类赋值
                })

        # 广告数据
        # {'广告类别1':'[], '类别2':[]}
        contents = {}
        # 查询广告类别表
        content_categories = ContentCategory.objects.all()
        # 遍历广告类别
        for content_category in content_categories:
            # 根据广告类别查询广告内容，主表查询副表的关联查询 content_category是主表
            contents[content_category.key] = content_category.content_set.filter(status=True).order_by('sequence')

        # 将data_dict进行渲染
        context = {'categories': data_dict, 'contents': contents}

        # 将首页渲染的html数据写入到前端的index.html文件中，方便用户访问前端看到渲染后的数据
        response = render(request, 'index.html', context=context)
        with open('/home/ubuntu/Desktop/front_end_pc/index.html', 'w') as f:
            f.write(response.content.decode())
        return JsonResponse({'code': 0})
